#pragma once

#include "../Command.h"
#include "../GameObjects/Exit.h"

class Movement
{
public:
	static void Init();
	static void DoMove(const CharacterPtr &character, const RoomPtr &room, Exit::ExitId direction);
};

class MoveWest : public Command
{
public:
	MoveWest();
	void execute(const CharacterPtr &character, const RoomPtr &room, const std::vector<std::string> &args) override;
};
typedef std::shared_ptr<MoveWest> MoveWestPtr;

class MoveNorth : public Command
{
public:
	MoveNorth();
	void execute(const CharacterPtr &character, const RoomPtr &room, const std::vector<std::string> &args) override;
};
typedef std::shared_ptr<MoveNorth> MoveNorthPtr;

class MoveEast : public Command
{
public:
	MoveEast();
	void execute(const CharacterPtr &character, const RoomPtr &room, const std::vector<std::string> &args) override;
};
typedef std::shared_ptr<MoveEast> MoveEastPtr;

class MoveSouth : public Command
{
public:
	MoveSouth();
	void execute(const CharacterPtr &character, const RoomPtr &room, const std::vector<std::string> &args) override;
};
typedef std::shared_ptr<MoveSouth> MoveSouthPtr;

class MoveUp : public Command
{
public:
	MoveUp();
	void execute(const CharacterPtr &character, const RoomPtr &room, const std::vector<std::string> &args) override;
};
typedef std::shared_ptr<MoveUp> MoveUpPtr;

class MoveDown : public Command
{
public:
	MoveDown();
	void execute(const CharacterPtr &character, const RoomPtr &room, const std::vector<std::string> &args) override;
};
typedef std::shared_ptr<MoveDown> MoveDownPtr;
